from textrank4zh import TextRank4Keyword, TextRank4Sentence
import jieba.analyse
from snownlp import SnowNLP
import pandas as pd
import numpy as np
import sys
import pymysql


def dataBase():
    # 连接数据库，创建连接对象connection
    # 连接对象作用是：连接数据库、发送数据库信息、处理回滚操作（查询中断时，数据库回到最初状态）、创建新的光标对象
    connection = pymysql.connect(
        host="localhost", user="root", password="123456", db="menuhub"
    )
    cur = connection.cursor()
    # 获取全部食品的信息
    cur.execute("select * from food")
    all = cur.fetchall()
    for i in all:
        # 获取每个食品的id
        index = i[0]
        # 根据食品的id来获取评价信息
        sql = "select * from foodcomment where foodID=" + str(index)
        cur.execute(sql)
        allcomment = cur.fetchall()
        text = ""
        # 拼接食品的评价，作为关键词提取的text
        for j in allcomment:
            # 要排除可能为空的评价
            if j[5] == None:
                continue
            text += j[5]
        # 如果评价的内容全部为空，则不需要提取关键词
        if text == "":
            continue
        # 提取关键词
        keywords = keywords_extraction(text)
        tag = ""
        # 将关键词整合为tag
        for j in keywords:
            tag += j["word"] + ","
        # 如果tag为空，则没必要更新数据库
        if tag == "":
            continue
        # 更新数据库的信息
        sql = "update food set tag= '" + tag + "' where id=" + str(index)
        print(sql)
        cur.execute(sql)
    connection.commit()
    connection.close()


# 关键词抽取
def keywords_extraction(text):
    # tr4w = TextRank4Keyword(allow_speech_tags=["adj", "nr", "nrfg", "ns", "nt", "nz"])
    tr4w = TextRank4Keyword(allow_speech_tags=["a"])
    # allow_speech_tags   --词性列表，用于过滤某些词性的词
    tr4w.analyze(
        text=text,
        window=2,
        lower=True,
        vertex_source="all_filters",
        edge_source="no_stop_words",
        pagerank_config={
            "alpha": 0.85,
        },
    )
    # text    --  文本内容，字符串
    # window  --  窗口大小，int，用来构造单词之间的边。默认值为2
    # lower   --  是否将英文文本转换为小写，默认值为False
    # vertex_source  -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点
    #                -- 默认值为`'all_filters'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'
    # edge_source  -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边
    #              -- 默认值为`'no_stop_words'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数

    # pagerank_config  -- pagerank算法参数配置，阻尼系数为0.85
    keywords = tr4w.get_keywords(num=6, word_min_len=2)
    # num           --  返回关键词数量
    # word_min_len  --  词的最小长度，默认值为1
    return keywords


if __name__ == "__main__":
#     text = (
#         "来源：中国科学报本报讯（记者肖洁）又有一位中国科学家喜获小行星命名殊荣！4月19日下午，中国科学院国家天文台在京举行“周又元星”颁授仪式，"
#         "我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、"
#         "副台长赵刚在致辞一开始更是送上白居易的诗句：“令公桃李满天下，何须堂前更种花。”"
#         "据介绍，这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站，"
#         "获得国际永久编号第120730号。2018年9月25日，经国家天文台申报，"
#         "国际天文学联合会小天体联合会小天体命名委员会批准，国际天文学联合会《小行星通报》通知国际社会，"
#         "正式将该小行星命名为“周又元星”。"
#     )
    # keywords = keywords_extraction(text)
    # print(keywords)
    dataBase()
